// 中卷 第三章 原生函数
// 常用的原生函数
// String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol()
var a = new String("abc");
console.log(typeof a); // object
console.log(a instanceof String); // true
console.log(Object.prototype.toString.call(a)); // [object String]
console.log(a);
// new String("abc") 创建的是字符串 "abc" 的封装对象，而非基本类型值 "abc"。

// 内部属性[[class]] 通过 Object.prototype.toString(..)来查看
// 所有typeof 返回为 object的对象都包含一个内部属性[[class]]
console.log(Object.prototype.toString.call([1, 2, 3]));
// 基本类型的值被各自的封装对象自动包装，所以它们内部有[[class]]
Object.prototype.toString.call("abc"); // "[object String]"
// 拆封 使用valueOf()函数
var a = new String("abc");
console.log(a.valueOf());

// 原生函数作为构造函数  不要求必须带new 会自动补上
var a = new Array(1, 2, 3);
// 创建包含 undefined 单元(而非“空单元”)的数组:
var a = Array.apply(null, { length: 3 }); // 要不Array(3) 更可靠
console.log(a);
// apply 是一个工具函数  第一个参数是this对象

// 除非不得已 否则不要使用 Object() Function() RegExp()
// 强烈建议使用常量形式定义这三个

// Date() 必须使用new
// Error() new 可有可无

// 原生原型
// 原生构造函数有自己的.prototype对象
// 字符串封装为对象后，就能访问String.prototype中的方法
// String.prototype.XYZ 可以简写为 String#XYZ
// String#indexof() String#charAt() String#substr() String#substring() String#slice()
